#ifndef SYMBOLE_H_
#define SYMBOLE_H_

#include <iostream>
#include <vector>
#include <string>
using namespace std;

#define FICHIER_MOTS_CLE "motsCles.txt"


/*! \file Symbole.h
    \brief La spécification de la classe sybmole
    \author Barrois Maurice Olivera-Silvera Sebastian
    \date 16.12.2013
*/

/*! \class Symbole
    \brief La classe symbole
 Classe mère représentant des symboles, permettant de les identifier
 */
////////////////////////////////////////////////////////////////////////////////
class Symbole {
    // classe qui permet d'identifier chaque types de symboles
public:
    
/*! \var enum categoriesymbole{ MOTCLE, VARIABLE, ENTIER, CHAINE, INDEFINI, FINDEFICHIER }
    \brief variable categoerieSymboel
 Cette variable contient les différentes catégories de mots que l'on peut rencontrer
 */
        enum categorieSymbole { MOTCLE, VARIABLE, ENTIER, CHAINE, INDEFINI, FINDEFICHIER };

/*! \fn Symbole(string s=string(""))
    \brief Fonction constructeur
 Cette fonction permet de construire et d'instancier un objet de la classe symbole
 */        
	Symbole(string s=string("")); // construit le symbole à partir de la chaine (string) ch lue par le lecteur de symbole dans un fichier
/*! \fn bool operator == (string ch);
    \brief Fonction ==
    \return boolean 
 Cette fonction permet de tester les egalités entre les symboles et les chaînes  
 */
	bool operator == (string ch) ; // pour tester l'égalité entre le symbole et une chaîne
/*! \fn inline bool operator != (string ch)
    \brief fonction !=
    \return boolean
 Cette fonction reprend le principe de == mais cette fois pour tester les différences
 */
        
        
	inline bool operator != (string ch) { return ! (*this == ch); } // pour tester la différence...
/*! \fn string getChaine()
    \brief fonction !=
    \return string
 Cette fonction reprend le principe de == mais cette fois pour tester les différences
 */
	inline string getChaine()           { return this->chaine;}     // accesseur
/*! \fn string \<\<()
    \brief fonction \<\<
    \return ostream
 Cette fonction reprend le principe de == mais cette fois pour tester les infériorités
 */
	friend ostream & operator <<(ostream & cout, Symbole symb);     // fonction amie pour pouvoir afficher un symbole sur cout 

private:
/*! \var chaine
    \brief variable chaine
 Cette variable dénomine les chaînes de symboles
 */
	string           chaine;              // chaine du symbole
/*! \var categorie
    \brief variable categorie
 cette variable dénomine les catégories de mots */
	categorieSymbole categorie;           // categorie du symbole (voir type énuméré ci-dessus)
/*! \fn static bool isMotCle(string s)
    \brief fonction isMotCle
 Cette fonction teste afin de déterminer si un mot est un mot clé
 */
	static bool      isMotCle(string s);  // méthode de classe : renvoie vrai si s est un mot clé du langage
/*! \fn static bool isChaine(string s)
    \brief fonction isChaine
 Cette fonction teste afin de déterminer si un mot est une chaine */
	static bool	 isChaine(string s);	//Méthode de classe: renvoie vrai si s est une Chaine
};

#endif /* SYMBOLE_H_ */
